package retrofit.call;

import java.io.IOException;
import org.jaaksi.demo.ptr.bean.response.Result;
import org.jaaksi.demo.ptr.util.LogUtil;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * 创建时间：2016年10月10日13:43 <br>
 * 作者：fuchaoyang <br>
 * 描述：retrofit callback 简易实现类
 */
public abstract class SimpleCallback<T> implements Callback<T> {
  // 请求成功，且errno == 0
  private boolean mIsSuccess;

  @Override public void onResponse(Call<T> call, Response<T> response) {
    onResult(response.body() == null ? null : response.body(), call);
  }

  @Override public void onFailure(Call<T> call, Throwable t) {
    if (t instanceof IOException) {
      // 如果是IO异常，那就是网络异常
      //      mIsSuccess = false;
      networkError(call, (IOException) t);
    } else {
      onResult(null, call);
    }
    //onResult(null, call);
  }

  private void onResult(T entity, Call<T> call) {
    //    mIsSuccess = false;

    // 处理call被cancel的情况，默认cancel会回调onFailure
    if (call != null && call.isCanceled()) {
      LogUtil.e("cancel", "-------------" + call.toString());
      return;
    }

    if (entity != null && entity instanceof Result) {
      Result result = (Result) entity;
      if (result.errno == 0) mIsSuccess = true;
    }
    onResponse(call, entity, mIsSuccess);
  }

  /** 网络异常 */
  public void networkError(Call<T> call, IOException ex) {
    onResponse(call, null, false);
  }

  /** 即使是成功的，也要看业务是否成功如errno!=0,所以这里统一处理除网络异常外的情况 */
  public abstract void onResponse(Call<T> call, T entity, boolean isSuccess);
}
